

// always requires an idle view 
#include "kb.h"
#include "touch_algorithm.h"
#include "gui.h"

#include "log.h"

#define TLOG        xLOG_INFO
#define LOG1        xLOG_INFO1
#define LOG2        xLOG_INFO2 

GUI_VIEW_FUNC_DECLARE_ALL;

GUI_VIEW_DEF_NR( manageTransition ) = 
{
    // name 
    .name = "Transition",
    
    // init 
    .init = initialize,
    .display_func = display_callback_func,
    .refresh_func_check = display_refresh_func,
    .destroy_func = on_destroy_func,
    .set_parent_func = on_set_parent_func, 
    
    // input 
    .on_touch = on_touch,
    .on_button = on_button,
    .on_event_update = on_event_update,     
    
    .pWidgetlist =  NULL,
    .widget_cnt = 0,

    .flag = GUI_VIEW_FLAG_NONE,
};

/* 当前view初始化
// 需要指定前使用的控件组
// 自动更新间隔，不使用自动更新间隔则interval = 0
// 指定生命周期，生命周期结束后自动调用 destroy， 测试过程中，可以将Lifetime = 0 使屏幕常亮 
*/
static void initialize(gui_menu_t * menu, void* pvParameter)
{
    menu->interval = 0;
    menu->lifetime = 0; 
}
/* 设置父级界面
// 返回时优先判断父级界面是否存在，如果存在返回父级界面；否则返回默认界面 
*/
static void on_set_parent_func(gui_menu_t * menu, const gui_view_t * parent)
{
//    p_this_parent = parent;
}
/* 销毁函数
// 在销毁前处理当前信息，比如不允许销毁时，将当前界面状态保存为background。
// true:  允许销毁
// false: 不允许自动销毁，则GUI只关闭当前显示，输入事件仍由当前view进行处理。
          那么view判断当前状态为background时，作出对应background下的按键、触摸等事件反馈
*/
static uint32_t on_destroy_func(gui_menu_t * menu)
{
        
    return GUI_DESTROY_RET_DEFAULT; 
}

/* 显示回调
   重新指定参数, 用来获取当前界面的控件组
   ** 当前界面有多个控件组时，应该有条件确定使用哪一组控件组 ** 
*/
static void display_callback_func(gui_menu_t * menu)
{
    
}

/* 刷新显示回调
   根据当前状态，重新绘制指定的控件组 
*/
static int display_refresh_func(gui_menu_t * menu)
{
    return 0;
}

/*
    拖动逻辑
    1. 拖动过程中，为防止越界，当某个方向上超过限定值，视为拖动完成。
        x < 0时，则 x < -GUI_LCD_RES_H || x >= 0 拖动完成。
        x > 0时，则 x > GUI_LCD_RES_H || x <= 0 拖动完成
        y < 0时，则 y < -GUI_LCD_RES_H || y >= 0
        y > 0时，则 y > GUI_LCD_RES_H || y <= 0 拖动完成
    
    2. 松开时，检测界面动画过程，
        x < 0时， x < -GUI_LCD_RES_H/2,  由 ui_cur -- >ui_sub (x-> (-GUI_LCD_RES_H))， 否则为 ui_sub --> ui_cur (x->(-GUI_LCD_RES_H))
        x > 0时， x > GUI_LCD_RES_H/2, 由 ui_cur --> ui_sub, 否则为 ui_sub --> ui_cur 
*/
static void on_touch(void* pvParameters, gui_menu_t * menu)
{
    tp_algo_evt_t* touch = (tp_algo_evt_t*)pvParameters;
    gui_transition_t* transition = gui_transition_get();

    switch( touch->type )
    {
        case TP_ALGO_EVT_TYPE_UP:
        {
            switch( transition->trans_direction )
            {
                case TRANS_DIR_TO_L:                                             
                if( transition->x < -(GUI_LCD_RES_H / 2) )
                {
                    gui_view_create_navigate( transition->ui_cur, transition->ui_sub, transition->x, 0, -GUI_LCD_RES_H, 0 );                            
                }
                else 
                {
                    gui_recovery_transition();
                }
                break;

                case TRANS_DIR_TO_R:
                if( transition->x > (GUI_LCD_RES_H / 2) )
                {
                    gui_view_create_navigate( transition->ui_cur, transition->ui_sub, transition->x, 0, GUI_LCD_RES_H, 0 );
                }
                else 
                {
                    gui_recovery_transition();
                }
                break;

                case TRANS_DIR_TO_U:
                if( transition->y < -(GUI_LCD_RES_V / 2) )
                {
                    GUI_VIEW_CREATE_NAVIGATE_TO_TOP( transition->ui_cur, transition->ui_sub, transition->y );
                }
                else 
                {
                    gui_recovery_transition();
                }
                break;

                case TRANS_DIR_TO_D:
                if( transition->y > (GUI_LCD_RES_V / 2) )
                {
                    GUI_VIEW_CREATE_NAVIGATE_TO_BOTTOM( transition->ui_cur, transition->ui_sub, transition->y );
                }
                else 
                {
                    gui_recovery_transition();
                }
                break;
            }
        }
        break;
        
        case TP_ALGO_EVT_TYPE_HOLD:
        if( transition->trans_direction & TRANS_DIR_HORIZONTAL )
        {
            transition->x = transition->x + touch->deltaX;
            if( transition->trans_direction == TRANS_DIR_TO_L )
            {
                // 检测 手动 偏移是否到了边界， 如果到了边界则自动创建对应界面 
                if( transition->x >= 0) //已经到边界了
                {
                    gui_view_create( transition->ui_cur );
                }
                else if( transition->x < -GUI_LCD_RES_H ) // 已经到边界了
                {
                    gui_view_create( transition->ui_sub );
                }
                else 
                {
                    gui_update_transition();
                }
            }
            else 
            {
                if( transition->x <= 0 )
                {
                    gui_view_create( transition->ui_cur );
                }
                else if( transition->x > GUI_LCD_RES_H )
                {
                    gui_view_create( transition->ui_sub );
                }
                else 
                {
                    gui_update_transition();
                }
            }
        }
        else if( transition->trans_direction & TRANS_DIR_VERTICAL )
        {
            transition->y = transition->y + touch->deltaY;
            // GUI_LOG1("[VIEW]:transition Y=%d", transition->y);
            if( transition->trans_direction == TRANS_DIR_TO_U )
            {
                if( transition->y >= 0 )
                {
                    gui_view_create( transition->ui_cur );
                }
                else if( transition->y < -GUI_LCD_RES_H )
                {
                    gui_view_create( transition->ui_sub );
                }
                else 
                {
                    gui_update_transition();
                }
            }
            else 
            {
                if( transition->y <= 0 )
                {
                    gui_view_create( transition->ui_cur );
                }
                else if( transition->y > GUI_LCD_RES_V )
                {
                    gui_view_create( transition->ui_sub );
                }
                else 
                {
                    gui_update_transition();
                }
            }
        }
        break;

        case TP_ALGO_EVT_TYPE_SLIDE_L:
        if( transition->trans_direction & TRANS_DIR_HORIZONTAL )
            GUI_VIEW_CREATE_NAVIGATE_TO_LEFT( transition->ui_cur, transition->ui_sub, transition->x );
        break;

        case TP_ALGO_EVT_TYPE_SLIDE_R:
        if( transition->trans_direction & TRANS_DIR_HORIZONTAL )
            GUI_VIEW_CREATE_NAVIGATE_TO_RIGHT( transition->ui_cur, transition->ui_sub, transition->x );
        break;

        case TP_ALGO_EVT_TYPE_SLIDE_D:
        if( transition->trans_direction & TRANS_DIR_VERTICAL )
            GUI_VIEW_CREATE_NAVIGATE_TO_BOTTOM( transition->ui_cur, transition->ui_sub, transition->y );
        break;

        case TP_ALGO_EVT_TYPE_SLIDE_U:
        if( transition->trans_direction & TRANS_DIR_VERTICAL )
            GUI_VIEW_CREATE_NAVIGATE_TO_TOP( transition->ui_cur, transition->ui_sub, transition->y );
        break;

        default:
        break;
    }
}

/* 界面的按键处理

*/
static void on_button(void* pvParameters, gui_menu_t * menu)
{
    (void)pvParameters;
    (void)menu;
}
/* 界面的自定义输入事件处理

*/
static void on_event_update(void * pvParameters, gui_menu_t * menu)
{
    (void)pvParameters;
    (void)menu;
}

